package util;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Random;

public class KMeans {
	        public ArrayList<Color> elementi = new ArrayList<Color>();
	        public ArrayList<Cluster> grupe = new ArrayList<Cluster>();
	        public int brojGrupa = 0;
	        Random rnd = new Random();

	        public void podeliUGRupe(int brojGrupa, double errT)
	        {
	            this.brojGrupa = brojGrupa;
	            if (brojGrupa == 0) return;
	            //------------  inicijalizacija -------------
	            for (int i = 0; i < brojGrupa; i++)
	            {
	                //int ii = rnd.nextInt(elementi.size());
	            	int ii = (i==0) ? 255 : 125;
	                Cluster grupa = new Cluster();
	                grupa.centar = new Color(ii,ii,ii);
	                grupe.add(grupa);
	            }
	            //------------- iterativno racunanje centara ---
	            for (int it = 0; it < 100; it++)
	            {
	                for (Cluster grupa : grupe)
	                    grupa.elementi = new ArrayList<Color>();
	                for (Color cc : elementi)
	                {
	                    int najblizaGrupa = 0;
	                    for (int i = 0; i < brojGrupa; i++)
	                    {
	                        if (grupe.get(najblizaGrupa).rastojanje(cc) >
	                            grupe.get(i).rastojanje(cc))
	                        {
	                            najblizaGrupa = i;
	                        }
	                    }
	                    grupe.get(najblizaGrupa).elementi.add(cc);
	                }
	                double err = 0;
	                for (int i = 0; i < brojGrupa; i++)
	                {
	                    err += grupe.get(i).pomeriCentar();
	                }
	                if (err < errT)
	                    break;
	            }
	        }
	    

	    public  class Cluster
	    {
	        public Color centar = new Color(0, 0, 0, 0);
	        public ArrayList<Color> elementi = new ArrayList<Color>();

	        public double rastojanje(Color c)
	        {
	            return Math.abs(c.getRed() - centar.getRed()) + Math.abs(c.getGreen() - centar.getGreen()) + Math.abs(c.getBlue() - centar.getBlue());
	        }

	        public double pomeriCentar()
	        {
	            double sR = 0;
	            double sG = 0;
	            double sB = 0;
	            double retVal = 0;
	            for (Color c : elementi)
	            {
	                sR += c.getRed();
	                sG += c.getGreen();
	                sB += c.getBlue();
	            }
	            int n = elementi.size();
	            if (n != 0)
	            {
	                Color nCentar = new Color(255, (int)(sR / n), (int)(sG / n), (int)(sB / n));
	                retVal = rastojanje(nCentar);
	                centar = nCentar;
	            }
	            return retVal;
	        }
	 }
	
}